发信人: xyx (红日), 信区: Mud
标  题: LPC ABC (1)
发信站: 重庆两江亭BBS站 (Sat Mar 21 00:55:05 1998), 转信

LPC就是我们用来写MUD的语言啦，它的语法和C 基本一样。它独特之处在于有简单的
OOP特性(简单但很有用:PP)，还有一个C里面没有的HASH表的类型：MAPPING
LPC和C还有一个不同是其主函数是CREATE()而不是MAIN()。create()别写错哦:PP

    LPC里面主要的(也是写MUD所足够的)数据类型有int,string,mapping,object,
mixed。下面主要讲一下这些类型了。

    因为整数类型对于写MUD已经足够，所以不用FLOAT了。同样的，因为我们的
汉字是双字节的，所以CHAR类型其实也没用，只需要STRING 类型就可以了。
STRING的定义，这里要提一下：string常量的赋值，假如是常量的话可以只用
“连接”的办法代替string，例如:
        string str = "我" "们" ;那么结果是str == "我们"
同样的str ="我" "们";也是一样，空格与换行在LPC编译时是被忽略的，所以我们
写MUD的时侯不仿多些TAB和换行，这样程序容易看些。
当然，除了直接连接之外还可以用 + 连接。在有变量的时侯就要用了。例如：
        string str0 = "我们";
        string str1 = "和"+str0+"大家";
        结果是str1 == "和我们大家"

  mixed是一个比较特别的类型。mixed 类型的变量可以赋任何其他类型的值。
这在未知变量类型的时侯非常有用。不过一般情况下很少会用到mixed。
    LPC里面没有“指针”的概念。在变量名前面加 * 的定义表示数组。如int *a
表示a 是整数数组。一般来说我们定义数组时是未知其大小的。所以定义时不用象
C 那样给定大小。数组和MAPPING有些类似，所以将在下面和MAPPING一起讲它们
的操作。





发信人: xyx (红日), 信区: Mud
标  题: LPC ABC (2)
发信站: 重庆两江亭BBS站 (Sat Mar 21 00:56:17 1998), 转信

    LPC里面没有“指针”的概念。在变量名前面加 * 的定义表示数组。如int *a
表示a 是整数数组。一般来说我们定义数组时是未知其大小的。所以定义时不用象
C 那样给定大小。数组和MAPPING有些类似，所以将在下面和MAPPING一起讲它们
的操作。

    object, 是OOP概念了，在LPC里面好象有CREATE()的都可以做object 类型变量
了。object 我们称为“对象”，在MUD里就是一件物品，一个房间或任何一个“具
体”的东西，都是OBJECT。“对象”，在OOP中是一些数据与基于这些数据的函数的
集合（好象文诌诌的？ :PP）嗯，object 中的数据一般不能直接操作（至少在LPC
里面不能的 :PP），所以对object的操作只有赋值（对object类型的赋直 ）和执行
object的函数( private函数不能被外部调用 )。
函数调用格式：
eg.     object ob;
        ob->test(1,2);

        基本格式： object类型变量名->函数名(函数参数列);
其中若该object 中未定义该函数名的函数则返回 0 值（呵呵，不会有出错信息的哦，
所以千万别写错名字了）。
发信人: xyx (红日), 信区: Mud
标  题: LPC ABC (2)
发信站: 重庆两江亭BBS站 (Sat Mar 21 00:56:17 1998), 转信

    LPC里面没有“指针”的概念。在变量名前面加 * 的定义表示数组。如int *a
表示a 是整数数组。一般来说我们定义数组时是未知其大小的。所以定义时不用象
C 那样给定大小。数组和MAPPING有些类似，所以将在下面和MAPPING一起讲它们
的操作。

    object, 是OOP概念了，在LPC里面好象有CREATE()的都可以做object 类型变量
了。object 我们称为“对象”，在MUD里就是一件物品，一个房间或任何一个“具
体”的东西，都是OBJECT。“对象”，在OOP中是一些数据与基于这些数据的函数的
集合（好象文诌诌的？ :PP）嗯，object 中的数据一般不能直接操作（至少在LPC
里面不能的 :PP），所以对object的操作只有赋值（对object类型的赋直 ）和执行
object的函数( private函数不能被外部调用 )。
函数调用格式：
eg.     object ob;
        ob->test(1,2);

        基本格式： object类型变量名->函数名(函数参数列);
其中若该object 中未定义该函数名的函数则返回 0 值（呵呵，不会有出错信息的哦，
所以千万别写错名字了）。
发信人: xyx (红日), 信区: Mud
标  题: LPC ABC (2)
发信站: 重庆两江亭BBS站 (Sat Mar 21 00:56:17 1998), 转信

    LPC里面没有“指针”的概念。在变量名前面加 * 的定义表示数组。如int *a
表示a 是整数数组。一般来说我们定义数组时是未知其大小的。所以定义时不用象
C 那样给定大小。数组和MAPPING有些类似，所以将在下面和MAPPING一起讲它们
的操作。

    object, 是OOP概念了，在LPC里面好象有CREATE()的都可以做object 类型变量
了。object 我们称为“对象”，在MUD里就是一件物品，一个房间或任何一个“具
体”的东西，都是OBJECT。“对象”，在OOP中是一些数据与基于这些数据的函数的
集合（好象文诌诌的？ :PP）嗯，object 中的数据一般不能直接操作（至少在LPC
里面不能的 :PP），所以对object的操作只有赋值（对object类型的赋直 ）和执行
object的函数( private函数不能被外部调用 )。
函数调用格式：
eg.     object ob;
        ob->test(1,2);

        基本格式： object类型变量名->函数名(函数参数列);
其中若该object 中未定义该函数名的函数则返回 0 值（呵呵，不会有出错信息的哦，
所以千万别写错名字了）。

    写了这么多终于写到LPC 最有特色的两个类型了，mapping和数组。
mapping和数组在“外观”上有些类似，所以在一起写了。前面提到过：mapping是
散列表，具体如何这里不详述了，只希望大家一定要记住mapping的格式！！( 实际
上这格式只在给变量赋初值时用到 )mapping 格式如下：
eg.     mapping a = ([ "ab" : 1 ,
                        "cd": 2 ,
                        ])
标准格式：
        mapping 变量名 = ([
                                key1 : value1 ,
                                key2 : value2 ,
                                ..........
                                ..........
                        ]);
其中key可以是除了int以外的任何值！！ (好象char也不行吧 :P )，包括任何数组
甚至mapping也可以做key ,而value则可以是任意所有值。mapping的应用在于：
可以用key来index得到相应的value值。如上面eg的，我们有：a["cd"] == 2,....
因为要用key来index的关系，在mapping中key值不能相等，若相等则覆盖掉原来该
key对应的value。写的有些乱了，SORRY :P

    那么一个mapping怎么改变它的值呢？有两个方法(下面设mapping map )。
1. map[key] = value;
2. map += ([key : value ]);
请大家留意第二种赋值方法，它跟我们将要提到的数组的方法一样的 。
在mapping中“删除”一个key （其相应value当然也没了）方法是：
        map_delete(map,key);
lpc里面的系统函数(efun)的命名一般按参数顺序来取名（ map_delete的参数就是
map在前，被delete的key在后的 ），希望大家注意。
另外mapping的efun还有values,keys,undefinedp
大家可以直接在MUD里 help efunname 来看帮助，也可以参阅 /doc/lpc/types/mapping
这一文件发信人: xyx (红日), 信区: Mud
标  题: LPC ABC (3)
发信站: 重庆两江亭BBS站 (Sat Mar 21 00:57:08 1998), 转信

数组：
即ARRAY，前面说过，LPC中的数组只要在类型后面加 * 就可以了
一般来说数组不用预先定大小
但若有需要可以用allocate(size)来固定大小。如：a = allocate(10);
在固定了SIZE之后好处是可以任意用下标定位来对数组元素操作。

我的习惯是不用固定SIZE的数组，因为那样更自由些。数组的操作在LPC里是相当强的。
最常见的是 +, - 操作，也是最useful的。
+就是通常的“连接”操作，
-是集合的“差”操作，如果没有这两个概念请看下面例子：
a == ({ 1,2,2,3, })
则a + ({2,3,4}) == ({ 1,2,2,3,2,3,4})
a - ({ 2,1}) == ({3})

请注意 - 的时候会把所有相同的元素都消掉的。

结合上面例子可以知道ARRAY常量的表示方法了，就是 ({元素,元素,....})
当然这只是一维数组（事实上我们用一维数组就足够了，我想）
在对数组的元素改变的时候，一般可以用直接赋值，如a[3] = 2;
如何删除一个元素？假如你确定该元素的值唯一的话可以用 - ({元素值 })
但要是有同值元素的话就会把它也删掉了，那不是我们所要的。
一般常用的方法是把该元素赋一个“不可能值”，或者说“无用值”，
然后再用 - 把该元素删除掉，比如说
我们确定数组内所有元素都为正，则我们可把那个元素赋值为0然后把数组 -= ({0})

关于array的一个很有用的函数是member_array
用法是 member_array(元素值，数组，起始下标（可选） ）;
函数返回数组中从下标开始第一个元素值为所搜索值的元素下标。若无则返回-1;
嗯，LPC的数组是跟C一样的，下标从0开始到size-1 ，请注意。
member_array的参数中起始下标一般可缺省。
eg: a = ({1,2,2,3})
则      member_array(2,a) == 1
        member_array(2,a,2) == 2
        member_array(4,a) == -1


ARRAY和MAPPING可以说是LPC里面最有用和最直接用的结构了。
再加上两个功能强大的函数：filter_array 和filter_mapping。
我们有了filter就可以实现对ARRAY，MAPPING里各元素的过滤操作。
这样一来我们就可以实现数据库的操作了，这样我们的LPC程序所拥有的功能
是非常强大了。

最后说一下多维数组的定义方法。
多维数组一般各维SIZE固定的，有两种方法定义：
eg1:
定义多维数组变量
   a = allocate(10);
   a[0] = allocate(10);
   a[1] = allocate(10);
   ...etc...
也就定义了a [10][10]

eg2:
用mixed 类型 = 多维数组常量
   mixed a;
  a = ({ ({ 1, 2, 3 }), ({ 1, 2, 3 }) });
